import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class LRUSolution {
    private int capacity;
    private static HashMap<Integer,Integer> result = new LinkedHashMap<>();
    public LRUSolution(int capacity){
        // 初始化缓存
        this.capacity = capacity;
    }

    public static void main(String[] args) {
        LRUSolution solution = new LRUSolution(3);
        solution.set(1,1);
        solution.set(2,2);
        solution.set(3,2);
        solution.get(1);
        solution.set(4,4);
        solution.get(2);
        for (Map.Entry<Integer, Integer> entry : result.entrySet()) {
            System.out.println("entry.getKey()+\"value:\"+entry.getValue() = " + entry.getKey() + "value:" + entry.getValue());
        }
    }
    public int get(int key){
        // 如果关键字key存在于缓存中，则返回key对应的value值，否则返回-1
        if(!result.containsKey(key)){
            return -1;
        }
        Integer integer = result.get(key);
        // 移动到最后
        result.remove(key);
        result.put(key,integer);
        return integer;
    }
    public void set(int key,int value){
        // 将记录(key，value)插入该结构，
        // 如果关键字Key已经存在，则变更其数据值value
        // 如key不存在，则向缓存中插入该组key-value
        // 如果key-value的数量超过capacity，弹出最久未使用的key-value

        // Integer orDefault = result.getOrDefault(key, value);  // 存在则返回原本的，不存在返回这个默认值value
        // linkedhashmap的get方法，可以刷新缓存，将其key值放到链表最后[需要添加accessOrder=true才可以刷新]
        // Integer integer = result.get(key);
        // 判断capacity
        if(this.capacity <= result.size()){
            // 需要删除，删除最近最少使用，删除最后一个更新最少的
            // 获取最后一个值的Key
//            Set<Integer> integers = result.keySet();
//            Object[] objects = integers.toArray();
//            // 由于linkehanmap特点
////            result.remove(objects[objects.length-1]);
//            result.remove(objects[0]);
            // 直接删除第一个
            result.remove(result.keySet().iterator().next());
        }
        // 如果存在hash值自动更新，更新在最后
        result.put(key,value);
//        if (integer!=null){
//            // 最后一个值移到第一个
//            beforNodeAccess(result);
//        }
    }

}
